package com.jk.hearthstone.core;

import com.jk.hearthstone.card.BaseCard;
import com.jk.hearthstone.card.biology.BaseBiology;
import com.jk.hearthstone.card.biology.hero.BaseHero;
import com.jk.hearthstone.data.Desktop;
import com.jk.hearthstone.data.History;

/**
 * @author jk
 * 所有装饰器的公共代理类
 * 用于方便修饰器调用上一级修饰类的方法
 */
public interface BaseController {

    /**
     * 出牌器(无选择对象)
     * @param desktop
     * @param history
     * @param card  打出的牌
     * @return 本次操作是否合法
     */
    boolean play(Desktop desktop,History history,BaseCard card);

    /**
     * 出牌器(有选择对象)
     * @param desktop
     * @param history
     * @param card 打出的牌
     * @param target 出牌选择的目标
     * @return 这次出牌动作是否合法
     */
    boolean play(Desktop desktop,History history,BaseCard card,BaseBiology target);

    /**
     * 不带目标的英雄技能
     * @param desktop
     * @param history
     * @param hero
     */
    void skill(Desktop desktop,History history,BaseHero hero);

    /**
     * 带目标的英雄技能
     * @param desktop
     * @param history
     * @param hero
     * @param target
     */
    void skill(Desktop desktop,History history,BaseHero hero,BaseBiology target);

    /**
     * 公共攻击方法
     * @param desktop
     * @param history
     * @param attacker 攻击者
     * @param target 目标
     */
    void attack(Desktop desktop,History history,BaseBiology attacker, BaseBiology target);

    /**
     * 公共的治疗方法
     * @param desktop
     * @param history
     * @param target 治疗对象
     * @param num 治疗数值
     */
    void cure(Desktop desktop,History history,BaseBiology target,Integer num);

    /**
     * 造成伤害
     * @param desktop
     * @param history
     * @param target
     * @param num
     */
    void hurt(Desktop desktop,History history,BaseBiology target, Integer num);

    /**
     * 下一回合
     * @param desktop
     * @param history
     */
    void nextTurn(Desktop desktop,History history);
}
